package main

import (
	"errors"
	"fmt"
	//"log"
	//"net"
	//"net/http"
	"reflect"

	//"net/rpc"
	//"os"
)

// 算数运算结构体
type Arith struct {
}

// 算数运算请求结构体
type ArithRequest struct {
	A int
	B int
}

// 算数运算响应结构体
type ArithResponse struct {
	Pro int // 乘积
	Quo int // 商
	Rem int // 余数
}

// 乘法运算方法
func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {
	res.Pro = req.A * req.B
	return nil
}

// 除法运算方法
func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {
	if req.B == 0 {
		return errors.New("divide by zero")
	}
	res.Quo = req.A / req.B
	res.Rem = req.A % req.B
	return nil
}

func main() {
	ari := new(Arith)
	fmt.Println(reflect.Indirect(reflect.ValueOf(ari)).Type().Name())
	fmt.Println(reflect.TypeOf(ari))

	for m := 0; m < reflect.TypeOf(ari).NumMethod(); m++ {
		method := reflect.TypeOf(ari).Method(m)
		fmt.Println(method)
		fmt.Println(method.Name)
		fmt.Println(method.Type)
		fmt.Println(method.Type.NumIn())
		argType := method.Type.In(1)
		fmt.Println(argType)
	}
}
//func main() {
//	rpc.Register(new(Arith)) // 注册rpc服务
//	rpc.HandleHTTP()         // 采用http协议作为rpc载体
//
//	lis, err := net.Listen("tcp", "127.0.0.1:8095")
//	if err != nil {
//		log.Fatalln("fatal error: ", err)
//	}
//
//	fmt.Fprintf(os.Stdout, "%s", "start connection")
//
//	http.Serve(lis, nil)
//	for {
//		conn, err := lis.Accept() // 接收客户端连接请求
//		if err != nil {
//			continue
//		}
//
//		go func(conn net.Conn) { // 并发处理客户端请求
//			fmt.Fprintf(os.Stdout, "%s", "new client in coming\n")
//		rpc.ServeConn(conn)
//		}(conn)
//	}
//}